package org.gc.dao.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.gc.webapp.util.page.BasePageSO;
import org.gc.webapp.util.page.PageList;
import org.hibernate.LockMode;


public interface BaseDao<T, PK extends Serializable> {

    /**
     * 获取T的所有对象列表
     */
    public abstract List<T> getAll();

    /**
     * 根据so进行搜索T的对象，返回可以翻页的对象列表
     * @param so
     * @return
     */
    public abstract PageList<T> getPageList(BasePageSO so);

    /**
     * 根据id获取对象
     */
    public abstract T get(PK id);

    /**
     * 根据id获取对象并锁住对象
     * @param id
     * @param lockMode
     * @return
     */
    public abstract T get(PK id, LockMode lockMode);

    /**
     * 查看某个对象是否存在
     */
    public abstract boolean exists(PK id);

    /**
     * 保存对象object到数据库
     */
    public abstract T save(T object);

    /**
     * 删除某个对象
     */
    public abstract void remove(PK id);

    /** 
     * 根据name query查询
     */
    public abstract List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams);

    /**
     * 根据id列表获取对象列表
     * @param ids
     * @return
     */
    public abstract List<T> getByIds(List<PK> ids);

    /**
     * 根据某个字段的值获取对象
     * @param fieldName
     *          字段名
     * @param value
     *          字段的值
     * @return
     *          成功返回该对象，否则返回null
     */
    public abstract T getBy(String fieldName, Object value);
    /**
     * 根据某个字段的值获取对象列表
     * @param fieldName
     *          字段名
     * @param value
     *          字段的值
     * @return
     *          成功返回该对象列表，否则返回空的列表
     */
    public List<T> getListBy(String propertyName, Object value);

}